package com.zenithmind.user.pojo.domain.valueobject;

import lombok.Value;
import io.swagger.v3.oas.annotations.media.Schema;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * 登录信息值对象
 * 遵循单一职责原则：只负责登录信息管理
 * 遵循封装原则：不可变对象，确保数据一致性
 */
@Value
@Schema(description = "登录信息")
public class LoginInfo {
    
    private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    @Schema(description = "最后登录时间")
    LocalDateTime lastLoginTime;

    @Schema(description = "最后登录IP地址")
    String lastLoginIp;

    @Schema(description = "登录次数")
    int loginCount;

    /**
     * 创建空的登录信息
     */
    public static LoginInfo empty() {
        return new LoginInfo(null, null, 0);
    }

    /**
     * 创建登录信息
     */
    public static LoginInfo create(String ipAddress, LocalDateTime loginTime) {
        validateIpAddress(ipAddress);
        return new LoginInfo(loginTime, ipAddress, 1);
    }

    /**
     * 记录新的登录
     */
    public LoginInfo recordLogin(String ipAddress, LocalDateTime loginTime) {
        validateIpAddress(ipAddress);
        return new LoginInfo(loginTime, ipAddress, loginCount + 1);
    }

    /**
     * 检查是否从未登录
     */
    public boolean isNeverLoggedIn() {
        return lastLoginTime == null;
    }

    /**
     * 检查是否为首次登录
     */
    public boolean isFirstLogin() {
        return loginCount <= 1;
    }

    /**
     * 获取格式化的最后登录时间
     */
    public String getFormattedLastLoginTime() {
        if (lastLoginTime == null) {
            return "从未登录";
        }
        return lastLoginTime.format(FORMATTER);
    }

    /**
     * 获取登录时间描述
     */
    public String getLoginTimeDescription() {
        if (lastLoginTime == null) {
            return "从未登录";
        }
        
        LocalDateTime now = LocalDateTime.now();
        long minutes = java.time.Duration.between(lastLoginTime, now).toMinutes();
        
        if (minutes < 1) {
            return "刚刚登录";
        } else if (minutes < 60) {
            return minutes + "分钟前";
        } else if (minutes < 1440) { // 24小时
            return (minutes / 60) + "小时前";
        } else {
            return (minutes / 1440) + "天前";
        }
    }

    /**
     * 检查IP地址是否发生变化
     */
    public boolean isIpChanged(String currentIp) {
        if (lastLoginIp == null) {
            return currentIp != null;
        }
        return !lastLoginIp.equals(currentIp);
    }

    /**
     * 获取登录统计信息
     */
    public String getLoginStats() {
        if (isNeverLoggedIn()) {
            return "从未登录";
        }
        return String.format("共登录%d次，最后登录：%s", loginCount, getLoginTimeDescription());
    }

    /**
     * 验证IP地址格式
     */
    private static void validateIpAddress(String ipAddress) {
        if (ipAddress == null || ipAddress.trim().isEmpty()) {
            throw new IllegalArgumentException("IP地址不能为空");
        }
        
        // 简单的IP地址格式验证
        String[] parts = ipAddress.split("\\.");
        if (parts.length != 4) {
            // 可能是IPv6或其他格式，暂时允许
            return;
        }
        
        try {
            for (String part : parts) {
                int num = Integer.parseInt(part);
                if (num < 0 || num > 255) {
                    throw new IllegalArgumentException("无效的IP地址格式: " + ipAddress);
                }
            }
        } catch (NumberFormatException e) {
            throw new IllegalArgumentException("无效的IP地址格式: " + ipAddress);
        }
    }

    /**
     * 检查是否为本地IP
     */
    public boolean isLocalIp() {
        if (lastLoginIp == null) {
            return false;
        }
        return lastLoginIp.startsWith("127.") || 
               lastLoginIp.startsWith("192.168.") || 
               lastLoginIp.startsWith("10.") ||
               lastLoginIp.equals("::1") ||
               lastLoginIp.equals("localhost");
    }

    /**
     * 获取IP地址的地理位置描述（简化版）
     */
    public String getIpLocationDescription() {
        if (lastLoginIp == null) {
            return "未知";
        }
        
        if (isLocalIp()) {
            return "本地";
        }
        
        // 这里可以集成IP地理位置服务
        return "外网 (" + lastLoginIp + ")";
    }
}
